﻿using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    /// <summary>
    /// Clase de la vista ConsultaCargaProyecto.
    /// </summary>
    public partial class ConsultaCargaProyecto : PageBase
    {
        #region Campos

        /// <summary>
        /// Clase de negocio para las operaciones de comunes negocio.
        /// </summary>
        ComunesNegocio comunesNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones de consulta cargas proyecto.
        /// </summary>
        ConsultaCargasProyectoNegocio consultaCargaProyecto;

        #endregion

        #region Propiedades

        /// <summary>
        ///  Obtiene o establece los filtros para la búsqueda.
        /// </summary>
        public ArchivoAsociadoProyectoInfo ArchivoAsociadoFilters
        {
            get
            {
                return (ArchivoAsociadoProyectoInfo)this.ViewState["ArchivoAsociadoFilters"];
            }

            set
            {
                this.ViewState["ArchivoAsociadoFilters"] = value;
            }
        }

        /// <summary>
        /// registros busqueda
        /// </summary>
        private List<ArchivoCargadoInfo> DataSourcePeriodo
        {
            get
            {
                if (this.ViewState["DataSourcePeriodo"] == null)
                {
                    this.ViewState["DataSourcePeriodo"] = new List<ArchivoCargadoInfo>();
                }

                return this.ViewState["DataSourcePeriodo"] as List<ArchivoCargadoInfo>;
            }

            set
            {
                this.ViewState["DataSourcePeriodo"] = value;
            }
        }

        /// <summary>
        /// registros busquedaObligatorio
        /// </summary>
        private List<ArchivoAsociadoProyectoInfo> DataSourceArchivosObligatorios
        {
            get
            {
                if (this.ViewState["DataSourceArchivosObligatorios"] == null)
                {
                    this.ViewState["DataSourceArchivosObligatorios"] = new List<ArchivoAsociadoProyectoInfo>();
                }

                return this.ViewState["DataSourceArchivosObligatorios"] as List<ArchivoAsociadoProyectoInfo>;
            }

            set
            {
                this.ViewState["DataSourceArchivosObligatorios"] = value;
            }
        }

        /// <summary>
        /// registros busqueda no obligatorios
        /// </summary>
        private List<ArchivoAsociadoProyectoInfo> DataSourceArchivosNoObligatorios
        {
            get
            {
                if (this.ViewState["DataSourceArchivosNoObligatorios"] == null)
                {
                    this.ViewState["DataSourceArchivosNoObligatorios"] = new List<ArchivoAsociadoProyectoInfo>();
                }

                return this.ViewState["DataSourceArchivosNoObligatorios"] as List<ArchivoAsociadoProyectoInfo>;
            }

            set
            {
                this.ViewState["DataSourceArchivosNoObligatorios"] = value;
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="ConsultaCargaProyecto"/>
        /// </summary>
        public ConsultaCargaProyecto()
        {
            this.comunesNegocio = new ComunesNegocio();
            this.consultaCargaProyecto = new ConsultaCargasProyectoNegocio();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            int pageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            this.grdArchivosNoObligatorios.PageSize = pageSize;
            this.grdArchivosObligatorios.PageSize = pageSize;
            this.grdCargasPeriodo.PageSize = pageSize;
            if (!this.IsPostBack)
            {
                this.ArchivoAsociadoFilters = new ArchivoAsociadoProyectoInfo();

                this.GetProyectos();
                this.GetMeses();
                this.GetAños();

                this.Search();
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón buscar. Obtiene los archivos obligatorios, los no obligatorios y las cargas de archivos dependiendo de los filtros.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
        }

        /// <summary>
        /// Método ejecutado al car click al botón buscar. Redirecciona a la página principal.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }

        /// <summary>
        /// Evento que se ejecuta cuando se cambia de página en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdArchivosObligatorios_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdArchivosObligatorios.PageIndex = e.NewPageIndex;
            this.grdArchivosObligatorios.DataSource = this.DataSourceArchivosObligatorios;
            this.grdArchivosObligatorios.DataBind();
        }

        /// <summary>
        /// Evento que se ejecuta cuando se cambia de página en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdArchivosNoObligatorios_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdArchivosNoObligatorios.PageIndex = e.NewPageIndex;
            this.grdArchivosNoObligatorios.DataSource = this.DataSourceArchivosNoObligatorios;
            this.grdArchivosNoObligatorios.DataBind();
        }

        /// <summary>
        /// Evento que se ejecuta cuando se cambia de página en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdCargasPeriodo_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdCargasPeriodo.PageIndex = e.NewPageIndex;
            this.grdCargasPeriodo.DataSource = this.DataSourcePeriodo;
            this.grdCargasPeriodo.DataBind();
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene todos los proyectos.
        /// </summary>
        public void GetProyectos()
        {
            this.ddlProyecto.DataSource = AppSessionManager.Instance.GetProyectosByPagina(AppUrls.ConsultaCargasProyecto);
            this.ddlProyecto.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlProyecto);
        }

        /// <summary>
        /// Obtiene los meses.
        /// </summary>
        private void GetMeses()
        {
            this.ddlMes.DataSource = this.comunesNegocio.GetMeses();
            this.ddlMes.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlMes);
        }

        /// <summary>
        /// Obtiene una lista de 10 años a partir del actual.
        /// </summary>
        private void GetAños()
        {
            this.ddlAño.DataSource = this.comunesNegocio.GetAños();
            this.ddlAño.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlAño);
        }

        /// <summary>
        /// Obtiene los archivos obligatorios y los no obligatorios.
        /// </summary>
        public void GetArchivosObligatoriosNoObligatorios()
        {
            this.DataSourceArchivosObligatorios = this.consultaCargaProyecto.GetArchivosObligatoriosAndNoObligatorios(this.ArchivoAsociadoFilters, true);
            this.grdArchivosObligatorios.DataSource = this.DataSourceArchivosObligatorios;
            this.grdArchivosObligatorios.DataBind();

            this.DataSourceArchivosNoObligatorios = this.consultaCargaProyecto.GetArchivosObligatoriosAndNoObligatorios(this.ArchivoAsociadoFilters, false);
            this.grdArchivosNoObligatorios.DataSource = this.DataSourceArchivosNoObligatorios;
            this.grdArchivosNoObligatorios.DataBind();
        }

        /// <summary>
        /// Obtiene los filtros y busca los archivos obligatorios y no obligatorios.
        /// </summary>
        private void Search()
        {
            this.GetFilters();
            this.GetArchivosObligatoriosNoObligatorios();
            this.GetCargasRealizadas();
        }

        /// <summary>
        /// Obtiene los filtros.
        /// </summary>
        public void GetFilters()
        {
            this.ArchivoAsociadoFilters.IdProyecto = ddlProyecto.SelectedValue == this.comunesNegocio.ValorTodos ? this.ArchivoAsociadoFilters.IdProyecto = null : int.Parse(ddlProyecto.SelectedValue);
            this.ArchivoAsociadoFilters.Año = ddlAño.SelectedValue == this.comunesNegocio.ValorTodos ? this.ArchivoAsociadoFilters.Año = null : int.Parse(ddlAño.SelectedValue);
            this.ArchivoAsociadoFilters.Mes = ddlMes.SelectedValue == this.comunesNegocio.ValorTodos ? this.ArchivoAsociadoFilters.Mes = null : int.Parse(ddlMes.SelectedValue);
        }

        /// <summary>
        /// Obtiene las cargas y recargas realizadas de los archivos.
        /// </summary>
        public void GetCargasRealizadas()
        {
            this.DataSourcePeriodo = this.consultaCargaProyecto.GetCargasRealizadasByPeriodoTodosEstatus(this.ArchivoAsociadoFilters);
            this.grdCargasPeriodo.DataSource = this.DataSourcePeriodo;
            this.grdCargasPeriodo.DataBind();
        }

        #endregion
    }
}